package main


import "fmt"
import ."api"
import "io/ioutil"
import "state"
import ."util"


func main() {

	data, err := ioutil.ReadFile("test.luac")
	if err != nil {
		panic(err)
	}

	ls := state.New()
	ls.Register("print", print)		// 注冊print函數
	ls.Register("getmetatable", getMetatable)
	ls.Register("setmetatable", setMetatable)

	ls.Load(data, "chunk", "b")
	ls.Call(0, 0)

}


func print(ls LuaState) int {

	nArgs := ls.GetTop()  // 此时栈里存放的都是参数

	for i := 1; i <= nArgs; i++ {

		if ls.IsBoolean(i) {

			fmt.Printf("%t", ls.ToBoolean(i))

		} else if ls.IsString(i) {

			fmt.Print(ls.ToString(i))

		} else {

			fmt.Print(ls.TypeName(ls.Type(i)))

		}

		if i < nArgs {
			fmt.Printf("\t")
		}

	}

	fmt.Println()

	return 0

}


// 有且仅有一个参数，所以传入索引1即可
// 如果值有元表，方法结束后元表已经在栈顶了
// 否则需要把nil值推入栈顶
// 最后返回1，把栈顶值(元表或nil)返回给Lua函数
func getMetatable(ls LuaState) int {

	PrintStack(ls)

	if !ls.GetMetatable(1) {
		ls.PushNil()
	}

	return 1

}


func setMetatable(ls LuaState) int {

	ls.SetMetatable(1)

	return 1

}